import request from "@/uni_modules/zhouWei-request/js_sdk/request";
import store from '@/store';
import base from '@/config/baseUrl';
import messageWhiteList from '@/config/messageWhiteList.js'
// #ifdef H5
import {
	h5Login
} from '@/config/html5Utils';
// #endif
// #ifdef MP-WEIXIN
import {
	onLogin
} from '@/config/login';
// #endif
let version_code = '';
// #ifdef APP-PLUS
import {
	getCurrentNo
} from '@/uni_modules/zhouWei-APPUpdate/js_sdk/appUpdate';
setTimeout(() => {
	getCurrentNo(function(res) {
		console.log("版本号", res);
		version_code = res.versionCode;
	});
}, 200);
// #endif
// console.log("数据1", base)
//可以new多个request来支持多个域名请求
let $http = new request({
	//接口请求地址
	baseUrl: base.baseUrl,
	//服务器本地上传文件地址
	fileUrl: base.baseUrl,
	// 服务器上传图片默认url
	defaultUploadUrl: "/api/user/updateUserHead",
	// 服务器上传文件名称
	defaultFileName: "file",
	//设置请求头（如果使用报错跨域问题，可能是content-type请求类型和后台那边设置的不一致）
	header: {
		'Content-Type': 'application/json;charset=UTF-8',
		// 'project_token': base.projectToken, //项目token（可删除）
	}
});
// console.log($http,44);

//请求开始拦截器
$http.requestStart = function(options) {
	// console.log("请求开始", options);
	if (options.load) {
		//打开加载动画
		store.commit("setLoadingShow", true);
	}
	// 图片、视频上传大小限制
	if (options.method == "FILE") {

		// 文件最大字节: options.maxSize 可以在调用方法的时候加入参数
		let maxSize = options.maxSize || '';
		for (let item of options.files) {
			if (item.fileType == 'image') {
				if (maxSize && item.size > maxSize) {
					setTimeout(() => {
						uni.showToast({
							title: "图片过大，请重新上传",
							icon: "none"
						});
					}, 500);
					return false;
				}
			} else if (item.fileType == "video") {
				if (item.duration < 3) {
					setTimeout(() => {
						uni.showToast({
							title: "视频长度不足3秒，请重新上传",
							icon: "none"
						});
					}, 500);
					return false;
				}
			}
		}

	}
	// #ifdef APP-PLUS
	// 添加当前版本号
	if (version_code) {
		options.header['version_code'] = version_code;
	}
	// #endif
	//请求前加入token
	//let storeUserInfo = store.state.userInfo;
	//if (storeUserInfo != {} && storeUserInfo!=null) { // nvue页面读取不到vuex里面数据，将取缓存
	var token = uni.getStorageSync("accessToken");
	// console.log(token)
	if (token) {
		options.header['Authorization'] = "Bearer " + token;
	}
	//}
	return options;
}
//请求结束
$http.requestEnd = function(options) {
	//判断当前接口是否需要加载动画
	if (options.load) {
		// 关闭加载动画
		store.commit("setLoadingShow", false);
	}
}
let loginPopupNum = 0;
//所有接口数据处理（此方法需要开发者根据各自的接口返回类型修改，以下只是模板）
$http.dataFactory = async function(res) {
	// console.log(111, res.response.statusCode);
	// console.log(res.response.statusCode);
	// console.log("接口请求数据", {
	// 	url: res.url,
	// 	resolve: res.response,
	// 	header: res.header,
	// 	data: res.data,
	// 	method: res.method,
	// });
	if (res.response.statusCode == 200) {
		if (res.url.indexOf("RefreshTokenByApp") != -1) {
			let httpData = res.response.data;
			return Promise.resolve(httpData);
		}
		let httpData = res.response.data;
		if (typeof(httpData) == "string") {
			httpData = JSON.parse(httpData);
		}
		if (httpData.success || httpData.code == 200) {
			return Promise.resolve(httpData.data);
		}
		//
	} else if (res.response.statusCode == 401 || res.response.statusCode == 403) {

		console.log("没权限了1")
		// 判断是否有刷新tokne
		var refreshToken = uni.getStorageSync("refreshToken");
		var accToken = uni.getStorageSync("accessToken");
		// return
		if (refreshToken && loginPopupNum < 1) {
			loginPopupNum++;

			// 如果有 刷新 重新调用接口
			let tokenResult = await $http.request({
				url: "https://auth.epumping.com/authApi/auth/RefreshTokenByApp", // 获取token接口地址
				data: {
					appId: getApp().globalData.androidIos,
					refreshToken: refreshToken,
					accToken: accToken
				}, // 获取接口参数
				method: "Post",
				load: false, //（默认 true 说明：本接口是否提示加载动画）
			});
			console.log("ces", tokenResult)
			if (tokenResult.data?.refreshToken) {
				console.log("AA", res)
				uni.setStorageSync('accessToken', tokenResult.data.accessToken);
				uni.setStorageSync('refreshToken', tokenResult.data.refreshToken);
				let result = await $http.request({
					url: res.url,
					data: res.data,
					method: res.method,
					header: res.header,
					isPrompt: res.isPrompt, //（默认 true 说明：本接口抛出的错误是否提示）
					load: res.load, //（默认 true 说明：本接口是否提示加载动画）
					isFactory: res.isFactory, //（默认 true 说明：本接口是否调用公共的数据处理方法，设置false后isPrompt参数将失去作用）
					resend: res.resend += 1 // 当前重发次数
				});
				loginPopupNum = 0;
				// 返回正确的结果(then接受数据)
				return Promise.resolve(result);
			} else {
				loginPopupNum = 0;
				// 回登录
				uni.showModal({
					title: '提示',
					content: '您的登录信息已过期，请重新登录',
					success: function(res) {
						if (res.confirm) {
							uni.navigateTo({
								url: "/pages/login/login"
							});
						} else if (res.cancel) {
							console.log('用户点击取消2');
						}
					}
				});
			}
		}
		//如果没有 跳回登录页面 清除用户信息
		else {
			// 弹出登录提示 清除用户存储的信息 token 刷新toekn userinfo
			goLogin()

		}
	} else { //其他错误提示   

		if (messageWhiteList.indexOf(httpData.message) == -1) {
			uni.showToast({
				title: httpData.message,
				icon: "none",
				duration: 3000
			});
			//返回错误的结果(catch接受数据)
			return Promise.reject({
				statusCode: 0,
				errMsg: httpData.message,
				data: httpData.data
			});
		} else {
			return Promise.resolve(httpData);
		}
	}

	/*********以上只是模板(及共参考)，需要开发者根据各自的接口返回类型修改*********/

};

// 错误回调
$http.requestError = function(e) {
	// e.statusCode === 0 是参数效验错误抛出的
	if (e.statusCode === 0) {
		throw e;
	} else {
		console.log(e);
		uni.showToast({
			title: "网络错误，请检查一下网络",
			icon: "none"
		});
	}
}

function goLogin() {
	// 回登录
	uni.removeStorageSync("userInfo");
	uni.removeStorageSync("accessToken");
	uni.removeStorageSync("refreshToken");
	uni.showModal({
		title: '提示',
		content: '您的登录信息已过期，请重新登录',
		success: function(res) {
			if (res.confirm) {
				uni.navigateTo({
					url: "/pages/login/login"
				});
			} else if (res.cancel) {
				console.log('用户点击取消2');
			}
		}
	});
}



export default $http;
